package com.virtualightning.mvvm.widget

import android.content.Context
import android.util.AttributeSet
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import android.widget.Switch
import com.virtualightning.mvvm.R
import com.virtualightning.mvvm.extensions.forEach
import com.virtualightning.mvvm.extensions.toGone
import com.virtualightning.mvvm.extensions.toInvisible
import com.virtualightning.mvvm.extensions.toVisible


///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/1/25 下午5:48
// 视图初始化回调方法
///////////////////////////////////////////////////////////////////////////
typealias ISwitchGeneratorCallback = (View) -> Unit

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/1/25 17:42:53
 *  Project : zxs-new
 *  切换视图
 */
open class SwitchView : FrameLayout {
    companion object {
        /**
         * 普通类型生成器
         */
        private const val Type_Normal = 0

        /**
         * 保持布局类型生成器
         */
        private const val Type_KeepLayout = 1
    }

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    )

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/25 下午5:49
    // 切换视图的生成回调 Map
    ///////////////////////////////////////////////////////////////////////////
    private val generatorMap = SparseArray<SwitchGenerator>()

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/25 下午5:49
    // 显示对应视图
    ///////////////////////////////////////////////////////////////////////////
    open fun show(id: Int?, hideOther: Boolean = true) : View? {
        var foundView: View? = null
        forEach {
            if(it.getTag(R.id.switchId) == id) {
                foundView = it
                it.toVisible()
            }
            else if(hideOther) {
                if(it.getTag(R.id.switchKeepLayout) == true) {
                    it.toVisible()
                }
                else {
                    it.toGone()
                }
            }
        }

        if(foundView == null && id != null) {
            // 没有找到对应 Id 的 View
            // 尝试去初始化
            val generator = generatorMap.get(id)
            val callback = generator.generator
            val generatedView = LayoutInflater.from(context).inflate(id, this, false)
            generatedView.setTag(R.id.switchId, id)
            generatedView.toVisible()
            when(generator.type) {
                Type_KeepLayout -> {
                    generatedView.setTag(R.id.switchKeepLayout, true)
                }
            }
            if(callback != null) {
                callback(generatedView)
            }
            addView(generatedView)
            foundView = generatedView
        }

        return foundView
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/10/13 11:49 下午
    // 隐藏指定 Id 使徒
    ///////////////////////////////////////////////////////////////////////////
    open fun hide(id: Int?): View? {
        var foundView: View? = null
        forEach {
            if(it.getTag(R.id.switchId) == id) {
                foundView = it
                if(it.getTag(R.id.switchKeepLayout) == true) {
                    it.toInvisible()
                } else {
                    it.toGone()
                }
            }
        }
        return foundView
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/25 下午6:01
    // 添加 View 生成器
    ///////////////////////////////////////////////////////////////////////////
    open fun addGenerator(id: Int, generator: ISwitchGeneratorCallback? = null) {
        generatorMap.put(id, SwitchGenerator(Type_Normal, generator))
    }

    /**
     * 生成被动隐藏 View 生成器
     * 通过该生成器生成的 View 在被隐藏时保留布局位置，使用 [View.toInvisible] 代替 [View.toGone]
     * @param id Int 布局 Id
     * @param generator Function1<View, Unit>? 视图初始化回调方法
     */
    open fun addKeepLayoutGenerator(id: Int, generator: ISwitchGeneratorCallback? = null) {
        generatorMap.put(id, SwitchGenerator(Type_KeepLayout, generator))
    }

    /**
     * Switch View 生成器
     */
    protected data class SwitchGenerator(
        /**
         * 生成 View 类型
         */
        val type: Int,

        /**
         * 生成器初始化回调方法
         */
        val generator: ISwitchGeneratorCallback?
    )
}